//======================================================================
//文件名称：gpio.h
//功能概要：GPIO底层驱动构件头文件
//芯片类型：STM32F103C8T6
//版权所有：江苏电子-索明何
//版本更新：2023-01-16  V1.0
//======================================================================
#ifndef   _GPIO_H             //防止重复定义（开头）
#define   _GPIO_H

//1.头文件包含
#include  "common.h"          //包含公共要素软件构件头文件

//2.宏定义
//(1)端口号宏定义，采用左移8位是为了使端口号位于变量port_pin的高8位
#define  PTA     (0<<8)       //端口A
#define  PTB     (1<<8)       //端口B
#define  PTC     (2<<8)       //端口C
#define  PTD     (3<<8)       //端口D

//(2)GPIO引脚方向宏定义
#define  GPIO_IN        0     //输入
#define  GPIO_OUT       1     //输出

//(3)GPIO引脚内部上拉/下拉选择宏定义
#define  PULL_UP        1     //上拉
#define  PULL_DOWN      0     //下拉

//(4)GPIO引脚输出速度宏定义
#define  LOW_SPEED      2     //低速（2MHz）
#define  MEDIUM_SPEED   1     //中速（10MHz）
#define  HIGH_SPEED     3     //高速（50MHz）

//3.对外接口函数声明
//=======================================================================
//函数名称：gpio_init
//函数功能：初始化指定端口引脚为GPIO功能，并设定引脚方向为输入或输出；
//          若为输出，还要设置引脚的输出状态
//函数参数：port_pin: (端口号|引脚号)，如(PTB|5)表示B端口5号引脚
//          dir:   引脚方向（可用宏定义作为函数实参，GPIO_IN为输入，GPIO_OUT为输出）
//          state: 引脚的输出状态（0为低电平，1为高电平）；
//	               引脚方向为输入时，可为0或1
//函数返回：无
//相关说明：
// (1)可用的GPIO引脚：PA0~PA12、PA15，PB0、PB1、PB3~PB15，PC13~PC15，PD0~PD1 
//    注：PA13、PA14分别用于SWD_DIO、SWD_CLK；PB2用于BOOT1引脚。  
//        若使用内部时钟，则PD0、PD1也可用作GPIO引脚。
// (2)输出采用推挽方式和默认的中速方式
//函数调用示例：
//   gpio_init((PTB|5), GPIO_OUT, 1);    //初始化PTB5引脚为GPIO输出功能，且输出高电平
//   gpio_init((PTA|2), GPIO_IN, 0);     //初始化PTA2引脚为GPIO输入功能
//=======================================================================
void gpio_init(uint16 port_pin, uint8 dir, uint8 state);

//=======================================================================
//函数名称：gpio_set
//函数功能：在初始化指定端口引脚为GPIO输出功能后，设置指定引脚的输出状态
//函数参数：port_pin: (端口号|引脚号)，如(PTB|5)表示B端口5号引脚
//          state:    引脚的输出状态（0为低电平，1为高电平）
//函数返回：无
//函数调用示例：
//   gpio_set((PTB|5), 0);     //设置PTB5引脚输出低电平
//=======================================================================
void gpio_set(uint16 port_pin, uint8 state);

//=======================================================================
//函数名称：gpio_get
//函数功能：在初始化指定端口引脚为GPIO输入功能后，获取指定引脚的输入状态
//函数参数：port_pin: (端口号|引脚号)，如(PTB|5)表示B端口5号引脚
//函数返回：指定端口引脚的输入状态（0或1）
//函数调用示例：
//    gpio_get((PTA|2));        //获取PTA2引脚的输入状态
//=======================================================================
uint8 gpio_get(uint16 port_pin);

//=======================================================================
//函数名称：gpio_reverse
//函数功能：在初始化指定端口引脚为GPIO输出功能后，反转引脚的输出状态
//函数参数：port_pin: (端口号|引脚号)，如(PTB|5)表示B端口5号引脚
//函数返回：无
//函数调用示例：
//   gpio_reverse((PTB|5));      //反转PTB5引脚的输出状态
//=======================================================================
void gpio_reverse(uint16 port_pin);

//=======================================================================
//函数名称：gpio_pull
//函数功能：在初始化指定端口引脚为GPIO输入功能后，选择引脚内部上拉/下拉电阻
//函数参数：port_pin:    (端口号|引脚号)，如(PTB|5)表示B端口5号引脚
//          pull_select: 引脚内部上拉/下拉选择（可用宏定义作为函数实参，PULL_UP为上拉，
//                       PULL_DWON为下拉）
//函数返回：无
//相关说明：STM32F103C8T6的所有GPIO引脚都有内部上拉电阻和下拉电阻
//函数调用示例：
//   gpio_pull((PTA|2), PULL_UP);      //选择使用PTA2引脚内部的上拉电阻
//=======================================================================
void gpio_pull(uint16 port_pin, uint8 pull_select);

//=======================================================================
//函数名称：gpio_out_speed
//函数功能：在初始化指定端口引脚为GPIO输出功能后，设置引脚输出速度
//函数参数：port_pin: (端口号|引脚号)，如(PTB|5)表示B端口5号引脚
//          speed:    引脚输出速度选择（可用宏定义作为函数实参，LOW_SPEED为低速，
//                    MEDIUM_SPEED为中速，HIGH_SPEED为高速）
//函数返回：无
//函数调用示例：
//   gpio_out_speed((PTB|5), HIGH_SPEED);    //设置PTB5引脚为高速输出
//=======================================================================
void gpio_out_speed(uint16 port_pin, uint8 speed);

#endif         //防止重复定义（结尾）
